﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
using CapaEntidades;

namespace CapaDatos
{
    public class daProducto
    {  
        #region singleton
        private static readonly daProducto _instancia = new daProducto();
        public static daProducto Instancia
        {
            get { return daProducto._instancia; }
        }
        #endregion

        #region Métodos
        public List<enProducto> spProductoBuscarXPresentacion(int idAlmacen,String prmPresentacion)
        {
            SqlConnection cn = null;
            SqlCommand cmd = null;
            SqlDataReader dr = null;
            List<enProducto> lstProducto = null;
            try
            {

                cn = Conexion.getConexion();
                cmd = new SqlCommand("spProductoBuscarXPresentacion", cn);
                cmd.Parameters.AddWithValue("@almacenId", idAlmacen);
                cmd.Parameters.AddWithValue("@pro_presentacion", prmPresentacion);
                cmd.CommandType = CommandType.StoredProcedure;
                cn.Open();
                dr = cmd.ExecuteReader();
                lstProducto = new List<enProducto>();
                while (dr.Read())
                {

                    enProducto producto = new enProducto();
                    producto.pro_id = Convert.ToInt32(dr[0].ToString());
                    producto.pro_codigo = dr[1].ToString();
                    producto.pro_presentacion = dr[2].ToString();
                    //producto.pro_fecVencimiento = dr[3].ToString();
                    producto.pro_uniMedida = dr[3].ToString();
                    producto.pro_estado = Convert.ToInt32(dr[4].ToString());
                    producto.pro_estadoDescripcion = dr[5].ToString();
                
                    enLinea linea = new enLinea();
                    linea.lin_id = Convert.ToInt32(dr[6].ToString());
                    linea.lin_descripcion = dr[7].ToString();
                    
                    //enLaboratorio laboratorio = new enLaboratorio();
                    //laboratorio.lab_id = Convert.ToInt32(dr[9].ToString());
                    //laboratorio.lab_nombre = dr[10].ToString();
                                     

                    enPrecio precio = new enPrecio();
                    precio.pre_id = Convert.ToInt32(dr[8].ToString());
                    precio.pre_fecha = dr[9].ToString();
                    precio.pre_precio = Convert.ToDouble(dr[10].ToString());
                    precio.pre_descuento = Convert.ToDouble(dr[11].ToString());
                    //precio.pre_estado = Convert.ToInt32(dr[13].ToString());

                    enAlmacen almacen = new enAlmacen();
                    almacen.alm_id = Convert.ToInt32(dr[12].ToString());
                    almacen.alm_nombre = dr[13].ToString();


                    producto.stock = 10;
                 
                    producto.linea = linea;
                    producto.precio = precio;
                    //producto.laboratorio = laboratorio;
                    producto.almacen = almacen;

                    lstProducto.Add(producto);
                }
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                dr.Close();
                cn.Close();
            }
            return lstProducto;

        }

        public enAlerta spRecepcionarProductoXML(String xml)
        {
            SqlConnection cn = null;
            SqlCommand cmd = null;
            SqlDataReader dr = null;
            enAlerta lstProducto = new enAlerta();
            try
            {

                cn = Conexion.getConexion();
                cmd = new SqlCommand("spRecepcionarProductoXML", cn);
                cmd.Parameters.AddWithValue("@prmXML", xml);
                cmd.CommandType = CommandType.StoredProcedure;
                cn.Open();
                dr = cmd.ExecuteReader();
                lstProducto.val = -1;
                if (dr.Read())
                {
                    lstProducto.val = Convert.ToInt16(dr[0].ToString());
                    lstProducto.msg = dr[1].ToString();

                }
            }
            catch (Exception)
            {
                lstProducto.val = -1;
                throw;
            }
            finally
            {
                dr.Close();
                cn.Close();
            }
            return lstProducto;

        }

        public List<enProducto> spProductosXLinea(int linea_id)
        {
            SqlConnection cn = null;
            SqlCommand cmd = null;
            SqlDataReader dr = null;
            List<enProducto> lstProducto = null;
            try
            {

                cn = Conexion.getConexion();
                cmd = new SqlCommand("spProductosXLinea", cn);
                cmd.Parameters.AddWithValue("@linea_id", linea_id);
                cmd.CommandType = CommandType.StoredProcedure;
                cn.Open();
                dr = cmd.ExecuteReader();
                lstProducto = new List<enProducto>();
                while (dr.Read())
                {

                    enProducto producto = new enProducto();
                    producto.pro_id = Convert.ToInt32(dr["pro_id"].ToString());
                    producto.pro_codigo = dr["pro_codigo"].ToString();
                    producto.pro_presentacion = dr["pro_presentacion"].ToString();                    
               

                    enPrecio precio = new enPrecio();                   
                    precio.pre_precio = Convert.ToDouble(dr["pre_precio"].ToString());
                    precio.pre_descuento = Convert.ToDouble(dr["pre_descuento"].ToString());
                  
                    producto.precio = precio;                  

                    lstProducto.Add(producto);
                }
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                dr.Close();
                cn.Close();
            }
            return lstProducto; 

        }
        public enAlerta spActualizarPrecio(enProducto p)
        {
            SqlConnection cn = null;
            SqlCommand cmd = null;
            SqlDataReader dr = null;
            enAlerta lstProducto = new enAlerta();
            try
            {

                cn = Conexion.getConexion();
                cmd = new SqlCommand("spActualizarPrecio", cn);
                cmd.Parameters.AddWithValue("@producto_id", p.pro_id);
                cmd.Parameters.AddWithValue("@pre_precio", p.precio.pre_precio);
                cmd.Parameters.AddWithValue("@pre_descuento", p.precio.pre_descuento);
                cmd.CommandType = CommandType.StoredProcedure;
                cn.Open();
                dr = cmd.ExecuteReader();
                lstProducto.val = -1;
                if (dr.Read())
                {
                    lstProducto.val = Convert.ToInt16(dr[0].ToString());
                    lstProducto.msg = dr[1].ToString();

                }
            }
            catch (Exception)
            {
                lstProducto.val = -1;
                throw;
            }
            finally
            {
                dr.Close();
                cn.Close();
            }
            return lstProducto;

        }
#endregion
    }
}
